# 2023年秋季学期《高等程序设计语言》期末考核项目：学生信息管理系统

import os# 导入必需模块
import os.path

#录入学生信息:学号、姓名、性别、数学成绩、物理成绩、Python成绩
def input_info():
    infile_info=open('stuinfomgr.txt','a')

    flag = 'y'
    while flag == 'y' or flag == 'Y':
        stu_id=input("请输入学生学号：")# 用input提示待录入的信息“学号、姓名、性别、数学成绩、物理成绩、Python成绩”，并将录入的信息写入学生信息文件stuinfomgr.txt
        stu_name=input("请输入学生姓名：")
        stu_gender=input("请输入学生性别：")
        stu_score_math=input("请输入学生数学成绩：")
        stu_score_physics=input("请输入学生物理成绩：")
        stu_score_python=input("请输入学生Python成绩：")
        stu_ave=(int(stu_score_math)+int(stu_score_physics)+int(stu_score_python))/3 # 根据“数学成绩、物理成绩、Python成绩”三科成绩计算平均成绩并写入学生信息文件stuinfomgr.txt
        stu_info=stu_id+'\t'+stu_name+'\t'+stu_gender+'\t'+stu_score_math+'\t'+stu_score_physics+'\t'+stu_score_python+'\t'+str(stu_ave)+'\n'
        infile_info.write(stu_info)
        flag=input("是否继续添加学生信息？y/n")
    print("信息录入完毕！")
    infile_info.close()

#查找学生信息：分为按学号和按姓名查找
def find_info():
    flag='y'
    while flag=='y'or flag=='Y':
        n = 0
        m = 0
        findfile_info=open('stuinfomgr.txt','r')#以可读方式打开
        line_info=findfile_info.readlines()
        find_nid=input("按学号查找请输入1,按姓名查找请输入2:")
        if find_nid=='1':
            find_id=input('请输入学生学号：')
            for line in line_info:
                if find_id in line:
                    print(line)
                    n=n+1
            if n==0:
                print("没有查找到学生信息")
        if find_nid=='2':
            find_name=input('请输入学生姓名：')
            for line in line_info:
                if find_name in line:
                    print(line)   # 将查找到的学生的所有信息“学号、姓名、性别、数学成绩、物理成绩、Python成绩、平均成绩”用print输出
                    m=m+1
            if m==0:
                print("没有查找到学生信息")  #用print反馈“未查到该学生信息”
        findfile_info.close()
        flag=input("是否继续查询学生信息？y/n")  # 询问是否继续查找学生信息

#删除学生信息：输入学号查找并删除
def del_info():
    flag='y'
    while flag=='y'or flag=='Y':
        n=0
        defile_infol = open('stuinfomgr.txt','r') #以可读方式打开
        line_info = defile_infol.readlines()
        defile_info2 = open('stuinfomgr.txt','w')
        del_id = input("请输入要删除的学生学号：")# 读取学生信息文件stuinfomgr.txt中的信息，删除stuinfomgr.txt文件中该学生的所有信息
        for line in line_info:
            if del_id in line:
                continue
            defile_info2.write(line)
            n=n+1
        if n==len(line_info):
            print("无此学生信息")
        else:
            print("学号为{0}的学生信息已删除".format(del_id))
        defile_infol.close()
        defile_info2.close()
        flag=input("是否继续删除学生信息？y/n")# 询问是否继续删除学生信息

#修改学生信息：输入学号，修改信息
def mod_info():
    flag='y'
    while flag=='y'or flag=='Y':
        n=0
        mod_id=input("请输入要修改的学生学号：")
        modfile_filel=open('stuinfomgr.txt','r')
        line_info=modfile_filel.readlines()
        modfile_file2=open('stuinfomgr.txt','w')
        for line in line_info:
            if mod_id in line:
                print("已找到学生信息，请修改信息")
                mod_name=input("请输入姓名：")
                mod_gender=input("请输入学生性别：")
                mod_score_math=input("请输入学生数学成绩：")
                mod_score_physics=input("请输入学生物理成绩：")
                mod_score_python=input("请输入学生Python成绩：")
                mod_ave=(int(mod_score_math)+int(mod_score_physics)+int(mod_score_python))/3
                mod_stu_info=mod_id+'\t'+mod_name+'\t'+mod_gender+'\t'+mod_score_math+'\t'+mod_score_physics+'\t'+mod_score_python+'\t'+str(mod_ave)+'\n'
                modfile_file2.write(mod_stu_info)
                print("修改成功")
                continue# 将修改后的学生信息写入学生信息文件stuinfomgr.txt，并保持文件内其他学生的信息不变
            modfile_file2.write(line)
            n=n+1
        if n==len(line_info):
            print("无此学生信息")
        else:
            print("学号为{0}的学生信息已修改".format(mod_id))
        modfile_filel.close()
        modfile_file2.close()
        flag=input("是否继续修改学生信息？y/n")# 询问是否继续修改其他学生信息

#排序  将学生信息文件stuinfomgr.txt中所有学生信息按关键字进行排序
def sort_info():
    flag='y' 
    def take_id(elem):
        return int(elem[0])
    def take_math(elem):
        return int(elem[3])
    def take_physics(elem):
        return int(elem[4])
    def take_Python(elem):
        return int(elem[5])
    def take_ave(elem):
        return int(elem[6])
    def output_sort(sort_list):
        for m in sort_list:
            for n in m:
                print("%+10s" % n,end=' ')# 读取学生信息文件stuinfomgr.txt中所有信息，采用格式化字符串的方法将单个学生信息存储为字典
            print()
    while flag =='y'or flag=='Y':
        sortfile_info=open('stuinfomgr.txt','r')
        line_info=sortfile_info.readlines()
        lst=[]
        for i in range(0,len(line_info)):
            lst.append('lst'+str(i))
        i=0
        for line in line_info:
            line=line.replace('\n','')
            lst[i]=line.split('\t')
            i=i+1
        sort_up_down=input("请选择（0升序，1降序）：")
        print("1.按学号排，2.按数学排，3.按物理排，4.按python排，5.按平均排")# 对所有学生信息的字典按照“学号”、“数学成绩”、“物理成绩”、“Python成绩”或“平均成绩”5个关键字进行排序
        sort_term=input("请选择功能：")
        if sort_up_down=='0':
            if sort_term=='1':
                lst.sort(key=take_id,reverse=False)
            if sort_term=='2':
                lst.sort(key=take_math,reverse=False)
            if sort_term=='3':
                lst.sort(key=take_physics,reverse=False)
            if sort_term=='4':
                lst.sort(key=take_Python,reverse=False)
            if sort_term=='5':
                lst.sort(key=take_ave,reverse=False)
            output_sort(lst)
        if sort_up_down=='1':
            if sort_term=='1':
                lst.sort(key=take_id,reverse=True)
            if sort_term=='2':
                lst.sort(key=take_math,reverse=True)
            if sort_term=='3':
                lst.sort(key=take_physics,reverse=True)
            if sort_term=='4':
                lst.sort(key=take_Python,reverse=True)
            if sort_term=='5':
                lst.sort(key=take_ave,reverse=True)
            output_sort(lst)
        flag=input("是否继续排序？y/n")

        
#统计学生人数
def sum_info():
    sumfile_info=open('stuinfomgr.txt','r')# 读取学生信息文件stuinfomgr.txt中的学生信息，统计共有多少人，统计结果用print函数展示
    line_info=sumfile_info.readlines()
    sum_stu=len(line_info)
    print("一共有{0}名学生。".format(sum_stu))
    sumfile_info.close()

#显示所有学生信息
def show_info():
    print("学号",end='\t')
    print("姓名",end='\t')
    print("性别",end='\t')
    print("数学",end='\t')
    print("物理",end='\t')
    print("Python",end='\t')
    print("平均",end='\t')
    print('\n')
    showfile_info=open('stuinfomgr.txt','r')# 读取学生信息文件stuinfomgr.txt中的学生信息，将所有学生的信息格式化地用print展示
    line_info=showfile_info.readlines()
    for line in line_info:
        print(line)
    showfile_info.close()

def show_choose():
    print("==========================学生信息管理系统==========================")
    print()
    print()
    print("                                目录                               ")
    print("                         1、录入学生信息")
    print("                         2、查找学生信息")
    print("                         3、删除学生信息")
    print("                         4、修改学生信息")
    print("                         5、排序")
    print("                         6、统计学生人数")
    print("                         7、显示所有学生信息")
    print("                         8、打开学生信息文件")
    print("                         9、退出系统")
    print()
    print()   
    print("===================================================================")


def main():
    show_choose()
    choose_menu=input("请选择功能：")
    while True:
        if choose_menu=='9':# 退出系统
            flag=input('您确定要退出系统吗？y/n')
            if flag=='y'or flag=='Y':
                print('谢谢您的使用，欢迎下次使用！！！')
                break #退出
            else:
                continue
        if choose_menu=='1':
            input_info()
        if choose_menu=='2':
            find_info()
        if choose_menu=='3':
            del_info()
        if choose_menu=='4':
            mod_info()
        if choose_menu=='5':
            sort_info()
        if choose_menu=='6':
            sum_info()
        if choose_menu=='7':
            show_info()
        if choose_menu=='8':# 功能模块8：打开学生信息文件stuinfomgr.txt
            path = os.getcwd()
            filename = 'stuinfomgr.txt'
            try:
                os.startfile(os.path.join(path,filename))
            except:
                print('学生信息文件不存在')
        
        choose_menu=input("请选择功能：")
main()